﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaDeBastanteodePoderes.Persistencia;
using SistemaDeBastanteodePoderes.Dominio;
using NHibernate.Exceptions;
using System.Data.SqlClient;

namespace SistemaDeBastanteodePoderes.Negocio
{
    public class SupervisorServiceImpl : ISupervisorService
    {
        #region region de dependencias
        IClienteDAO clienteDAO = null;
        ITipoEmpresaDAO tipoEmpDAO = null;
        IPoderDAO poderDAO = null;
        ITipoServicioDAO tipoSerDAO = null;
        IRepresentanteDAO representanteDAO = null;
        #endregion

        #region operaciones de negocio
        public Cliente RegistrarCliente(string nroRUC, string razSocial, DateTime fecIniOperaciones, int tipoEmpCodigo, int cntEmpleados)
        {

            //Excepcion si falta algun dato a crear
            if (nroRUC == null || nroRUC.Length == 0 || 
                razSocial == null || razSocial.Length == 0 ||
                fecIniOperaciones == null || tipoEmpCodigo <= 0 || cntEmpleados <= 0)
                throw new DatosInsuficientesException("Faltan datos para crear al cliente");

            Cliente clienteResult = null;
            Cliente clienteACrear = new Cliente();
            clienteACrear.nroRUC = nroRUC;
            clienteACrear.razSocial = razSocial;
            clienteACrear.fecIniOperaciones = fecIniOperaciones;
            clienteACrear.tipEmpresa = tipoEmpDAO.Obtener(tipoEmpCodigo);
            clienteACrear.cntEmpleados = cntEmpleados;

            try
            {
                clienteResult = clienteDAO.Crear(clienteACrear);
            }
            catch (GenericADOException exNH)
            {
                throw new EntidadRepetidaException(exNH.InnerException.Message);
            }
            catch (Exception e)
            {
                throw new EntidadRepetidaException("Error desconocido", e);
            }

            return clienteResult;

        }
        public Poder AgregarPoder(string CodCorto, string NomPoder, int tipoSerCodigo)
        {
            //Excepcion si falta algun dato
            if (CodCorto == null || CodCorto.Length == 0 ||
                NomPoder == null || NomPoder.Length == 0 ||
                tipoSerCodigo <= 0)
                throw new DatosInsuficientesException("Faltan datos para agregar poder");

            Poder poderResult = null;
            Poder poderACrear = new Poder();
            poderACrear.CodCorto = CodCorto;
            poderACrear.NomPoder = NomPoder;
            poderACrear.Servicio = tipoSerDAO.Obtener(tipoSerCodigo);

            try
            {
                poderResult = poderDAO.Crear(poderACrear);
            }
            catch (GenericADOException exNH)
            {
                throw new PoderRepetidoException(exNH.InnerException.Message);
            }
            catch (Exception e)
            {
                throw new PoderRepetidoException("Error desconocido", e);
            }

            return poderResult;

        }
        public InformacionSupervisor ConsultarPoderes(string nroRUC, int tipoDocCodigo, string nroDoc, string GruBastanteo, int tipoIntCodigo)

        {
            InformacionSupervisor infSup = new InformacionSupervisor();

            Cliente clienteAUX = null;
            Representante representanteAUX = null;

            if (nroRUC != null)
            {
                foreach (Cliente cliente in clienteDAO.ListarTodos())
                {
                    if (cliente.nroRUC == nroRUC)
                    {
                        clienteAUX = cliente;
                        break;
                    }
                }
                if (clienteAUX != null)
                {
                    if (GruBastanteo != null || tipoIntCodigo > 0)
                    {
                        foreach (Bastanteo bastanteo in clienteAUX.bastanteos)
                        {
                            if (GruBastanteo != null && tipoIntCodigo <= 0)
                            {
                                if (bastanteo.Grupo == GruBastanteo)
                                {
                                    infSup.bastanteos.Add(bastanteo);
                                }
                            }
                            if (tipoIntCodigo > 0 && GruBastanteo == null)
                            {
                                if (bastanteo.Intervencion.Codigo == tipoIntCodigo)
                                {
                                    infSup.bastanteos.Add(bastanteo);
                                }
                            }
                        }
                        if (infSup.bastanteos != null) 
                        {
                            infSup.hayDatos = true;
                            infSup.mensaje = "Se encontraron datos para los criterios ingresados";
                        }
                        else
                        {
                            infSup.hayDatos = false;
                            infSup.bastanteos = null;
                            infSup.mensaje = "No se encontraron datos";
                        }

                    }
                    else
                    {
                        infSup.hayDatos = true;
                        infSup.bastanteos = clienteAUX.bastanteos;
                        infSup.mensaje = "Se encontraron datos para el RUC del cliente";
                    }
                }
                else
                {
                    infSup.hayDatos = false;
                    infSup.bastanteos = null;
                    infSup.mensaje = "No se encontraron datos para el RUC ingresado";
                }
            }

            if (tipoDocCodigo > 0 && nroDoc != null)
            {
                foreach (Representante representante in representanteDAO.ListarTodos())
                {
                    if (representante.TipDoc.Codigo == tipoDocCodigo && representante.NroDoc == nroDoc)
                    {
                        representanteAUX = representante;
                        break;
                    }
                }
                if (representanteAUX != null)
                {
                    if (GruBastanteo != null || tipoIntCodigo > 0)
                    {
                        foreach (Bastanteo bastanteo in representanteAUX.Empresa.bastanteos)
                        {
                            if (GruBastanteo != null && tipoIntCodigo <= 0)
                            {
                                //Para solo evaluar el grupo de bastanteo en los bastanteos que coinciden con el grupo asignado al representante
                                if (bastanteo.Grupo == GruBastanteo && bastanteo.Grupo == representanteAUX.GruBastanteo)
                                {
                                    infSup.bastanteos.Add(bastanteo);
                                }
                            }
                            if (tipoIntCodigo > 0 && GruBastanteo == null)
                            {
                                //Para solo evaluar el tipo de intervencion en los bastanteos que coinciden con el grupo asignado al representante
                                if (bastanteo.Intervencion.Codigo == tipoIntCodigo && bastanteo.Grupo == representanteAUX.GruBastanteo)
                                {
                                    infSup.bastanteos.Add(bastanteo);
                                }
                            }
                        }
                        if (infSup.bastanteos != null) 
                        {
                            infSup.hayDatos = true;
                            infSup.mensaje = "Se encontraron datos para los criterios ingresados";
                        }
                        else
                        {
                            infSup.hayDatos = false;
                            infSup.bastanteos =  null;
                            infSup.mensaje = "No se encontraron datos";
                        }
                    }
                    else
                    {
                        foreach (Bastanteo bastanteo in representanteAUX.Empresa.bastanteos)
                        {
                            if (bastanteo.Grupo == representanteAUX.GruBastanteo)
                            {
                                infSup.bastanteos.Add(bastanteo);
                            }
                        }
                        if (infSup.bastanteos != null) 
                        {
                            infSup.hayDatos = true;
                            infSup.mensaje = "Se encontraron datos para el RUC del cliente";
                        }
                        else
                        {
                            infSup.hayDatos = false;
                            infSup.bastanteos = null;
                            infSup.mensaje = "No se encontraron datos";
                        }

                    }
                }
                else
                {
                    infSup.hayDatos = false;
                    infSup.bastanteos = null;
                    infSup.mensaje = "No se encontraron datos para el RUC ingresado";
                }
            }

            return infSup;
        }
        public void EliminarPoder(int poderCodigo)
        {
            Poder poderAEliminar = null;

            poderAEliminar =  poderDAO.Obtener(poderCodigo);

            try
            {
                poderDAO.Eliminar(poderAEliminar);
            }
            catch (GenericADOException exNH)
            {
                throw new PoderUtilizadoException(exNH.Message);
            }
        }
        #endregion

        #region metodos de soporte para entidad cliente
        public Cliente ObtenerCliente(int codigo)
        {
            return clienteDAO.Obtener(codigo);
        }

        public ICollection<Cliente> ListarClientes()
        {
            return clienteDAO.ListarTodos();
        }
        #endregion

        #region metodos de soporte para entidad poder
        public Poder ObtenerPoder(int codigo)
        {
            return poderDAO.Obtener(codigo);
        }

        public ICollection<Poder> ListarPoderes()
        {
            return poderDAO.ListarTodos();
        }
        #endregion
        

        #region metodos de soporte para tipo de empresa
        public ICollection<TipoEmpresa> ListarTiposEmpresa()
        {
            return tipoEmpDAO.ListarTodos();
        }
        #endregion

        
        #region metodos de soporte para tipo de servicio
        public ICollection<TipoServicio> ListarTiposServicio()
        {
            return tipoSerDAO.ListarTodos();
        }
        #endregion
        

    }
}